# coding=utf-8
import pandas as pd
from pathlib import Path
from docx import Document
import random
import os
import re

FILE = Path(__file__).resolve()  # 得到当前文件在电脑上的绝对路径
ROOT = FILE.parents[0]  # 获得当前文件的父目录
os.chdir(ROOT)


# 将txt文本以逗号进行分割转换成为标准格式
def old_create_data():
    df_ = pd.read_csv("医学检测.txt", encoding="utf-8", sep="。", engine='python')
    bsf = [i for i in range(5000, 5000 + df_.shape[1])]

    for ii, jj in zip(df_, bsf):  # 返回一个对象
        ident = "(pid=" + "A8-" + "{}".format(jj) + "-2" + ") "  # 标识符
        sen = ii.strip()  # 每一句话
        real = ident + sen
        f = open("新医学检测.txt", "a", encoding="utf-8")
        f.write(real)
        f.write("\n")


# 将word转换成为标准形式
def new_create_data():
    # 构造文档对象，传入文件地址
    document = Document('论文检测.docx')

    lis = []

    for paragraph in document.paragraphs:  # 遍历文章
        if paragraph.text.strip():  # 如果不为空行
            lis.append(paragraph.text.strip())

    # 如果想要读取word中所有表格数据，使用以下几行
    # tables = document.tables
    # for table in tables:
    #     for row in table.rows:
    #         print([cell.text for cell in row.cells])

    num = 0
    for i in lis:
        # 去除字符串内全部空格
        remove_spaces = "".join(i.split())
        # 只保留汉字
        chinese_character = ''.join(re.findall('[\u4e00-\u9fa5]', remove_spaces))
        num += 1

        if chinese_character == "绪论":
            before_paragraph = num  # 绪论所在行数
        elif chinese_character == "参考文献":
            after_paragraph = num - 1  # 参考文献所在行的上一行

    num = 0
    lis_new = []
    for i in lis:
        num += 1
        # 如果结尾是。 ] 或者 ：则取这句话
        if num > before_paragraph and i[-1] in ["]", "：", "。"]:
            # print(i[-1])  # 测试结尾字符（很重要！！）
            lis_new.append(i)
            # print(i)
            # print("*"*20)
        if num == after_paragraph:
            break

    bsf = [i for i in range(5000, 5000 + len(lis_new))]

    for ii, jj in zip(lis_new, bsf):
        ident = "(pid=" + "A9-" + "{}".format(jj) + "-2" + ")\t"  # 标识符
        sen = ii  # 每一句话
        real = ident + sen
        f = open("新论文检测.txt", "a", encoding="utf-8")
        f.write(real)
        f.write("\n")
        f.close()


# 输出两个最终的的数据
def use_data():
    # pandas将拼音后两列数据合并
    os.chdir(r'C:\Users\A\Desktop')
    # df = pd.read_csv("新医学检测.txt", encoding="utf-8", sep=")", names=["bsf", "text"])
    df = pd.read_csv("新论文检测.txt", encoding="utf-8", sep="\t", names=["bsf", "text"])
    # df_new是读取拼音数据
    df_new = pd.read_csv("same_pinyin.txt", sep="\t")
    df_new.fillna('', inplace=True)  # 将缺失值替换成空字符串
    df_new["pinyin"] = df_new["同音同调"] + df_new["同音异调"]
    df_new.drop(['同音同调', '同音异调'], axis=1, inplace=True)  # axis=1 表示删除列
    df_new.columns = ["hanzi", "bianyin"]

    for i in range(len(df["text"])):  # 遍历每一句话

        a = df["text"][i].strip()  # 原话
        # bsf = df["bsf"][i][5:].strip()  # 原先的是以逗号为分隔符所以需要加上右括号
        bsf = df["bsf"][i][5:-1].strip()
        print("原话：", a)
        # print("标识符：", bsf)

        # 汉字的范围为”\u4e00-\u9fa5“，这个是用Unicode表示的
        res1 = ''.join(re.findall('[\u4e00-\u9fa5]', a))  # 将这句话转换成为只有汉字
        # print("转化为只有汉字后：", res1)

        ran_num = random.randint(0, 4)  # 随机取0-4中任意一个数字
        font_lis = []  # 字的列表
        index_lis = []  # 下标的列表
        for ii in range(ran_num):
            hz1 = random.choice(res1)  # 随机选中一个字
            font_lis.append(hz1)
            # print("输出这个错字：", hz1)  # 输出这个字
            index_lis.append(a.index(hz1) + 1)  # 为了避免取到非汉字而报错！！！
            # 输出这个字在原话中的下标（如果恰好选中了原话中有多个字的字，则选中第一个字的下标）
            # print("输出这个错字的下标 + 1：", a.index(hz1)+1)
        print(list(set(font_lis)))  # 输出所有错字
        print(list(set(index_lis)))  # 输出错字所有下标

        new_font_lis = list(set(font_lis))  # 错字去重
        new_font_lis.sort(key=font_lis.index)  # 去重不改变顺序

        new_index_lis = list(set(index_lis))  # 下标去重
        new_index_lis.sort(key=index_lis.index)  # 去重不改变顺序

        dictionary = dict(zip(new_index_lis, new_font_lis))  # 以（下标：错字）的形式组合成为字典
        new_dict = sorted(dictionary.items())  # 字典内部根据键（下标）排序 --->>> 变成了列表包围字典
        new_new_dict = []  # 最终包围所有元素的列表！！！

        for ii in new_dict:
            new_new_dict.append(ii[0])
            new_new_dict.append(ii[1])

        # 转化后的新的话
        for k in new_font_lis:  # 遍历所有错字
            for kk in df_new.loc[df_new['hanzi'].str.contains(k)]["bianyin"]:  # 遍历每一个错字的
                for j in kk:  # i为这一行字符串(那一排可以替换的字)
                    # replace的第三个参数为指定要替换的旧值出现次数，默认为所有
                    # print("输出错话：", a.replace(k, j, 1))
                    a = a.replace(k, j, 1)  # 累计每次替换
                    # TODO 后续修改只能从词库中选定第一个错字
                    break  # 暂时先让他输出一句话

        aa = "(pid={}) {}".format(bsf, a)
        f = open("before.txt", "a", encoding="utf-8")
        f.write(aa)
        f.write("\n")
        f.close()

        num = len(new_dict)
        # print(num)
        if num == 0:
            bb = "{}, 0".format(bsf)
            f = open("after.txt", "a", encoding="utf-8")
            f.write(bb)
            f.write("\n")
            f.close()
        else:
            new_num = int(len(new_dict) * 2)
            # format里面填充格式为（下标，字，下标，字...）
            bb = "{}".format(bsf) + (new_num * ", {}").format(*new_new_dict)
            f = open("after.txt", "a", encoding="utf-8")
            f.write(bb)
            f.write("\n")
            f.close()

        print("输出错话：", a)
        print()


if __name__ == '__main__':
    # old_create_data()  # 输入为.txt文件
    # new_create_data()  # 输入为.docx文件
    use_data()
